import os
import subprocess
import datetime
from zoneinfo import ZoneInfo


VERSION = (5, 4, 0, 'final', 0)     # 'alpha', 'beta', 'rc', 'final'
TZ_SHANGHAI = ZoneInfo('Asia/Shanghai')


def get_version(version=None):
    main = '.'.join(str(x) for x in version[:3])

    sub = ''
    if version[3] != 'final':
        mapping = {'alpha': 'a', 'beta': 'b', 'rc': 'rc'}
        sub = mapping[version[3]] + str(version[4])

    return main + sub


def get_git_changeset():
    # Repository may not be found if __file__ is undefined, e.g. in a frozen
    # module.
    if "__file__" not in globals():
        return None
    repo_dir = os.path.dirname(os.path.abspath(__file__))
    git_log = subprocess.run(
        'git log --pretty="format:%ct||%an" --quiet -1',
        capture_output=True,
        shell=True,
        cwd=repo_dir,
        text=True,
    )

    try:
        cmd_output = git_log.stdout
        timestamp, author = cmd_output.split('||')
        tz = datetime.timezone.utc
        timestamp = datetime.datetime.fromtimestamp(int(timestamp), tz=tz)
    except ValueError:
        return None

    return {'timestamp': timestamp, 'author': author}


def get_git_tagset():
    # Repository may not be found if __file__ is undefined, e.g. in a frozen
    # module.
    if "__file__" not in globals():
        return None
    repo_dir = os.path.dirname(os.path.abspath(__file__))
    git_log = subprocess.run(
        "git for-each-ref --count=3 --sort='-taggerdate' "
        "--format='%(refname:short) || %(taggerdate:format:%s) || %(*authorname) || %(*authoremail) || %(subject)'"
        " refs/tags/*",
        capture_output=True,
        shell=True,
        cwd=repo_dir,
        text=True,
    )

    try:
        cmd_output = git_log.stdout
        lines = cmd_output.split('\n')[0:3]
        tz = datetime.timezone.utc
        tags = []
        for line in lines:
            tag = line.split('||')
            if len(tag) == 5:
                version, tm, author, email, content = tag
                new_tag = [
                    version.strip(' ').lower(),
                    datetime.datetime.fromtimestamp(int(tm), tz=tz),
                    author, email,
                    content.replace('*', '\n*')
                ]
                tags.append(new_tag)

    except ValueError:
        return None

    return tags


LAST_VERSION_TAGS = [
    (
        'v5.4.0',
        datetime.datetime(year=2025, month=11, day=20, hour=9, minute=10, second=0, tzinfo=TZ_SHANGHAI),
        'yushunwang', '',
        """
* 新增云坤认证 app auth_provider，定义8个数据库模型，封装配置参数、回调白名单管理者类；提交人：yushunwang
* 云坤认证，新增 认证url获取、认证跳转和邮件验证码发送接口，实现认证回调视图和邮箱绑定视图。；提交人：yushunwang
* 云坤认证，实现 授权码换取token、校验token有效性和续期token接口和测试用例；提交人：yushunwang
* 云坤认证，实现 认证服务提供者列举接口和测试用例；提交人：yushunwang
* 云坤认证，实现js文件中英翻译；提交人：yushunwang
* 云坤认证，实现一个错误提示网页；提交人：yushunwang
* global，修改几个模型的显示名称；提交人：yushunwang
* users，用户第三方登录认证增加“云坤认证”类型；提交人：yushunwang
* 登录认证优化，移除旧版云坤AAI认证，对接新版云坤认证，支持AAI和ORCID；提交人：yushunwang
* 更新英文翻译；提交人：yushunwang
        """
    ),
    (
        'v5.3.1',
        datetime.datetime(year=2025, month=10, day=15, hour=10, minute=28, second=0, tzinfo=TZ_SHANGHAI),
        'yushunwang', '',
        """
* vo，列举vo接口返回重复vo记录问题修复，测试用例增加去重测试用；提交人：yushunwang
* 自定义uuid模型字段OptimizedUUIDField优化，修复预载多对多字段时转uuid对象报错的问题，同时支持str和bytes类型转uuid；提交人：yushunwang
        """
    ),
    (
        'v5.3.0',
        datetime.datetime(year=2025, month=9, day=28, hour=11, minute=1, second=0, tzinfo=TZ_SHANGHAI),
        'yushunwang', '',
        """
* 腾讯会议预定，增加2个站点配置参数，“开启违约邮件通知”参数管理是否发送违约邮件通知，“开启违约惩罚限制”参数管理是否开启惩罚限制，用户违约一段时间内限制预定会议；提交人：yushunwang
* 腾讯会议预定，会议预定列举和详情查询接口修改，用户可以查询到别人帮自己预定的会议记录；提交人：yushunwang
* 腾讯会议预定，会议预定取消和会前通知时间设置接口修改，用户可以管理别人帮自己预定的会议记录；提交人：yushunwang
* 自定义优化的UUID字段类OptimizedUUIDField和抽象模型基类OptimizedUUIDModel;封装一个字符串加密解密类XorB64Encryptor；提交人：yushunwang
        """
    ),
    (
        'v5.2.0',
        datetime.datetime(year=2025, month=9, day=24, hour=9, minute=40, second=0, tzinfo=TZ_SHANGHAI),
        'yushunwang', '',
        """
* 定时器管理命令timertask优化，并且增加子命令“enable”和“disable”管理定时器的开机自启动设置；提交人：yushunwang
* vo，VoMember模型增加个人组排序设置字段“vo_order_value”；列举vo组接口增加“order_value”组排序值字段，并按个人组排序设置字段“vo_order_value”排序；提交人：yushunwang
* vo，创建vo接口修改，创建组时为组长创建组员关系记录；组员列举接口屏蔽掉组长的组员关系；提交人：yushunwang
* vo，组移交接口修改，新组长原组员记录不变，旧组长变为组员管理员；提交人：yushunwang
* vo，新增用户个人vo组排序值设置接口和测试用例；提交人：yushunwang
* 云主机，云主机模型增加一个排序值字段，个人、管理员列举云主机接口和vo组云主机列举接口返回数据增加排序值字段，并完善测试用例；提交人：yushunwang
* 云主机，新增云主机排序值修改接口和测试用例；提交人：yushunwang
        """
    ),
]


__version__ = get_version(VERSION)
__git_changeset__ = get_git_changeset()
# __git_tagset__ = get_git_tagset()
__git_tagset__ = LAST_VERSION_TAGS
